/* @flow */

import {
  tip,
  hasOwn,
  isDef,
  isUndef,
  hyphenate,
  formatComponentName
} from 'core/util/index'

export function extractPropsFromVNodeData(
  data: VNodeData,
  Ctor: Class<Component>,
  tag

? : string
):
  ? Object {
    // we are only extracting raw values here.
    // validation and default values are handled in the child
    // component itself.
    const propOptions = Ctor.options.props
    if(isUndef(propOptions)
)
{
  return
}
const res = {}
const {attrs, props} = data
if (isDef(attrs) || isDef(props)) {
  for (const key in propOptions) {
    const altKey = hyphenate(key)
    if (process.env.NODE_ENV !== 'production') {
      const keyInLowerCase = key.toLowerCase()
      if (
        key !== keyInLowerCase &&
        attrs && hasOwn(attrs, keyInLowerCase)
      ) {
        tip(
          `Prop "${keyInLowerCase}" is passed to component ` +
          `${formatComponentName(tag || Ctor)}, but the declared prop name is` +
          ` "${key}". ` +
          `Note that HTML attributes are case-insensitive and camelCased ` +
          `props need to use their kebab-case equivalents when using in-DOM ` +
          `templates. You should probably use "${altKey}" instead of "${key}".`
        )
      }
    }
    checkProp(res, props, key, altKey, true) ||
    checkProp(res, attrs, key, altKey, false)
  }
}
return res
}

function checkProp(
  res: Object,
  hash: ?Object,
  key: string,
  altKey: string,
  preserve: boolean
): boolean {
  if (isDef(hash)) {
    if (hasOwn(hash, key)) {
      res[key] = hash[key]
      if (!preserve) {
        delete hash[key]
      }
      return true
    } else if (hasOwn(hash, altKey)) {
      res[key] = hash[altKey]
      if (!preserve) {
        delete hash[altKey]
      }
      return true
    }
  }
  return false
}
